#include "imagen.h"
#include "stdio.h"
#include "string.h"
imagen::imagen()
{
	

}

void imagen::cargarImagen(const char *nombreArchivo, int flag)
{
    img= cvLoadImage(nombreArchivo,flag);
    ///////////////////////////////////////////
   
}

void imagen::guardarImagen(const char *archivoSalida)
{
    cvSaveImage(archivoSalida,img);
}

IplImage * imagen::enviarPuntero()
{
	return img;
	
}

void imagen::obtenerPuntero(IplImage * i)
{
	img=i;
}

int imagen::cambiarEspacioColor(string espacio)
{
	string espacioViejo;
	
	espacioViejo.append(img->colorModel);
	
	if (espacio==espacioViejo) return 0;
	else
	{
		if (espacioViejo=="RGB")
		{
			if(espacio=="HSV")
			{
				cvCvtColor(img,img,CV_BGR2HSV);
				strcpy(img->colorModel,espacio.c_str());
				return 0;
			}
			if(espacio=="HSL")
			{
				cvCvtColor(img,img,CV_BGR2HLS);
				strcpy(img->colorModel,espacio.c_str());
				return 0;
			}
			else return 1;
		}
		
		if (espacioViejo=="HSV")
		{
			if(espacio=="RGB")
			{
				cvCvtColor(img,img,CV_HSV2RGB);
				strcpy(img->colorModel,espacio.c_str());
				return 0;
			}
			if(espacio=="HSL")
			{
				cvCvtColor(img,img,CV_HSV2BGR);
				cvCvtColor(img,img,CV_BGR2HLS);
				strcpy(img->colorModel,espacio.c_str());
				return 0;
			}
			else return 1;
		}
		
		if (espacioViejo=="HSL")
		{
			if(espacio=="HSV")
			{
				cvCvtColor(img,img,CV_HLS2BGR);
				cvCvtColor(img,img,CV_BGR2HLS);
				strcpy(img->colorModel,espacio.c_str());
				return 0;
			}
			if(espacio=="RGB")
			{
				cvCvtColor(img,img,CV_HLS2BGR);
				strcpy(img->colorModel,espacio.c_str());
				return 0;
			}
			else return 1;
		}
		
	}
        return 1;
}

string imagen::obtenerEspacioColor()
{
	string espacio;
	
	espacio.append(img->colorModel);
	return espacio;
	
}

void imagen::umbral(int umbral)
{
	
	cvThreshold(img,img,umbral,255,CV_THRESH_BINARY);
	
}

void imagen::umbralAdaptivo()
{
	cvAdaptiveThreshold(img, img,255,CV_ADAPTIVE_THRESH_GAUSSIAN_C,CV_THRESH_BINARY,71,3);
}

imagen imagen::copiaGris()
{
	imagen a;
	IplImage *gris;
	
	gris= cvCreateImage( cvGetSize(img), 8, 1 );
	cvCvtColor(img,gris,CV_BGR2GRAY);	
	a.obtenerPuntero(gris);
	
	return a;
}

int imagen::numeroCanales()
{
    return img->nChannels;
}

IplImage * imagen::obtenerCanal(int numeroCanal)
{
    IplImage *canal1,*canal2,*canal3;
    canal1= cvCreateImage( cvGetSize(img), 8, 1 );
    canal2= cvCreateImage( cvGetSize(img), 8, 1 );
    canal3= cvCreateImage( cvGetSize(img), 8, 1 );

    cvSplit(img,canal1,canal2,canal3,0);

    if(numeroCanal==1) return canal1;
    if(numeroCanal==2) return canal2;
    if(numeroCanal==3) return canal3;
    else return canal1;
}

void imagen::copiaGris(imagen a)
{
    IplImage *gris;

    gris= cvCreateImage( cvGetSize(img), 8, 1 );
    cvCvtColor(img,gris,CV_BGR2GRAY);
    a.obtenerPuntero(gris);
}
